package controller;

import java.io.IOException;
import java.io.Serializable;

import java.net.UnknownHostException;

import excecoes.ConexaoNaoIniciadaException;

import mensagens.Mensagem;
import mensagens.MensagemChat;
import mensagens.MensagemEntrarJogo;
import mensagens.MensagemRolarDados;

public class ControladorCliente extends ControladorJogo implements Serializable{
	
	private static final long serialVersionUID = 6393529948801425757L;
	private static ControladorCliente instance = null;
	private ControladorComunicacaoCliente comunicacao;
	private boolean preparado = false;

	private ControladorCliente(){
		comunicacao = null;
	}
	
	public static ControladorCliente getInstance(){
		if(instance == null){
			instance = new ControladorCliente();
		}
		return instance;
	}
	
	public boolean isPreparado() {
		return preparado;
	}
	
	public void setPreparado(boolean preparado) {
		this.preparado = preparado;
	}
	
	public void iniciarConexao(String ipServidor) throws IOException{
		if (this.comunicacao == null){
			this.comunicacao = new ControladorComunicacaoCliente(ipServidor);
			this.comunicacao.iniciarConexao();
		}
	}
	
	public void entrarNoJogo(String apelido) throws UnknownHostException, ConexaoNaoIniciadaException, IOException{
		this.enviarMensagem(new MensagemEntrarJogo(apelido));
	}
	
	public void enviarChat(String nomeDestino, String mensagem, String nomeOrigem) throws UnknownHostException, ConexaoNaoIniciadaException, IOException{
		this.enviarMensagem(new MensagemChat(nomeDestino, mensagem, nomeOrigem));
	}
	
	public void rolarDados() throws UnknownHostException, ConexaoNaoIniciadaException, IOException{
		this.enviarMensagem(new MensagemRolarDados());
	}
	
	private void enviarMensagem(Mensagem msg) throws ConexaoNaoIniciadaException, UnknownHostException, IOException{
		if (this.comunicacao != null){
			this.comunicacao.enviarMensagem(msg);
		}else{
			throw new ConexaoNaoIniciadaException();
		}
	}
	
	public void fecharConexao() {
		try {
			this.comunicacao.fecharConexao();
		} catch (IOException e) {
		}
	}
}
